package com.gallop.mq.core.template.handler.registry;

import com.gallop.mq.core.template.handler.DeliveryType;
import com.gallop.mq.core.template.handler.MessageDeliveryHandler;
import lombok.Builder;
import lombok.Data;

import java.util.function.Function;

/**
 * MQ消息监听预处理器
 * @param <T> 具体MQ使用的监听类型
 * @param <M> 具体MQ使用的消息类型
 */
@Data
@Builder
public class RegistryPreprocessor<T, M> {

    /**
     * 创建MQ具体监听器
     */
    private final ListenerCreator<T> listenerCreator;
    /**
     * MQ具体消息到达后，从参数列表中提取消息类型
     */
    private final Function<ListenerArgs, DeliveryType> deliveryTypeProvider;
    /**
     * MQ具体消息到达后，从参数列表中提取RPC相关信息
     */
    private final Function<ListenerArgs, MessageDeliveryHandler.RpcInfo<?>> rpcInfoProvider;
    /**
     * MQ具体消息到达后，从参数列表中提取MQ使用的原始信息
     */
    private final Function<ListenerArgs, M> rawMessageProvider;
    /**
     * MQ具体消息到达后，将MQ使用的原始消息转换成业务消息
     */
    private final Function<M, Object> mqMessageProvider;
}
